/*************************************************************************
	> File Name: oj-529_dragonbug.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月18日 星期三 20时01分41秒
 ************************************************************************/

#include <iostream>
#include <queue>
using namespace std;

struct node {
    int x, y, step;
};

int n, m;
char mmap[150][150];
int dir[8][2] {
    //移动时取0-3
    0, 1,
    1, 0,
    0, -1,
    -1, 0,
    //斜向
    //攻击时取0-7
    1, 1,
    1, -1,
    -1, 1,
    -1, -1
};

bool func() {
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    if (a == 0) return false;
    int mark[150][150] = {0};
    //对敌人的被攻击范围进行广搜
    for (int i = 0; i < 8; ++i) {
        for (int j = 1; j < 150; ++j) {
            int x = a + dir[i][0] * j;
            int y = b + dir[i][1] * j;
            //如果不可以走，直接break
            if (mmap[x][y] != 'O') break;
            mark[x][y] = 1;
        }
    }
    //如果当前虫子的位置在射程之内
    //或者在敌人的位置
    //直接输出0
    mark[a][b] = 1;
    if (mark[c][d] == 1) {
        cout << 0 << endl;
        return true;
    }
    //开始对虫子进行广搜
    queue<node> que;
    que.push((node){c, d, 0});
    //标记已经走过了
    mark[c][d] = 2;
    while (!que.empty()) {
        node temp = que.front();
        que.pop();
        for (int i = 0; i < 4; ++i) {
            int x = temp.x + dir[i][0];
            int y = temp.y + dir[i][1];
            if (mark[x][y] == 1) {
                cout << temp.step + 1 << endl;
                return true;
            }
            if (mmap[x][y] == 'O' && mark[x][y] != 2) {
                //这个点既可以走也没有走过
                que.push((node){x, y, temp.step + 1});
                //标记走过
                mark[x][y] = 2;
            }
        }
    }
    cout << "Impossible!" << endl;
    return true;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> &mmap[i][1];
    }
    while (func());
    return 0;
}
